const userModel = require("../models/user")
//引入密码加密的包 bcrypt
const bcrypt = require("bcrypt")
//jwt
const jwt = require("jsonwebtoken")
const _ = require("lodash")
const config = require("../config/config")
module.exports={
    //注册一个用户
    async addUser(ctx){
        //拿到前端传过来的数据
        const {name,password} = ctx.request.body;
        //检验body中数据的类型
        ctx.verifyParams({
            name: {type:"string", required:true},
            password:{type:"string", required:true}
        });
        //业务级别的验证;用户名不能重复
        const users = await userModel.find({name})
        //一旦throw了错误会终止代码的执行
        if(users.length!==0) ctx.throw(409,"用户名不能重复")
        //处理一下前端传来的数据
        const user = {name,password}
        //对密码进行加密处理
        //生成盐 & 对密码进行加密
        const salt =bcrypt.genSaltSync(10);
        user.password = bcrypt.hashSync(password,salt)
        //对数据库进行新增操作
        //res 新增的那一条数据
        const {_id} = await userModel.create(user);
        //对刚刚那一条新增的数据重新发起查询 为的是让投影启作用
        const userNoPassWord = await userModel.findById(_id)
        ctx.body = userNoPassWord;
    },
    //登录
    async login(ctx){
        //拿到前端传过来的数据
        const {name,password} = ctx.request.body;
        //判断一下name是否在用户集合中
        const users = await userModel.find({name}).select("+password")
        if(users.length !== 1) ctx.throw(404,"当前用户不存在")
        //如果name存在 则去校验password是否正确
        let user = users[0]
        if (!bcrypt.compareSync(password,user.password)) ctx.throw(403,"密码错误")

        //登录成功之后应该要返回一个token字符串
        const token = jwt.sign({_id:user._id,name:user.name},config.tokenCipher,{expiresIn:"7d"})
        ctx.body=token
    },
    //上传头像
    async avatar(ctx){
        console.log("avatar")
        //1.将头像上传到public目录
        let path = ctx.request.files.avatar.path;
        let name = path.split("\\").pop();
        //2.当前接口返回头像的地址
        ctx.body = `http://127.0.0.1:8888/img/${name}`
    },




    //查询到所有的用户
    async getAll(ctx){
        //连接数据库的代码 代码本身没问题  可有可能在网络没有连上的情况导致代码报错

        //http://127.0.0.1/user/getAll/#/a?q=w&page=1&size=5
        //实现分页 模糊查询
        //第几页
        let {page=1,size=5,q=""} = ctx.query;
        console.log(page,size,q)
        //一页显示几条
        //处理一些边界情况
        page = Math.max(+page,1)
        size = Math.max(+size,1)

        const users = await userModel.find({name:{$regex:new RegExp(q)}}).skip((page-1)*size).limit(size)
        ctx.body=users
    },
    //根据id查询用户
    async getUserById(ctx){
        const id = ctx.params.id;
        const user = await userModel.findById(id);
        ctx.body = user;
    },
    //根据id更新用户
    async updateUserById(ctx){
        const id = ctx.params.id;
        const {name} = ctx.request.body;
        name ? "" : ctx.throw(422,"用户名必传");
        const user = await userModel.findByIdAndUpdate(id,{name},{new:true})
        ctx.body = user
    },
    //根据id删除用户
    async deleteUserById(ctx){
        const id = ctx.params.id;
        await userModel.findByIdAndRemove(id)
        ctx.status=204
    }
}